#ifndef _KRLOBJNODE_T_H_
#define _KRLOBJNODE_T_H_

#include <spinlock_t.h>
#include <list_t.h>
#include <krlsem_t.h>

/* I/O 包类型 */

enum OBJNODE_TYPE
    {
    OBJNODE_TYPE_NUL = 0,  /* 初始化类型 */
    OBJNODE_TYPE_DEV,      /* 访问设备的类型 */
    OBJNODE_TYPE_FIL       /* 访问文件的类型 */
    };

/* I/O (对象结点) 包数据结构 */

typedef struct s_OBJNODE
    {
    spinlock_t         lock;             /* I/O包自旋锁 */
    list_t             list;             /* I/O包链表 */
    sem_t              sem_complete;     /* I/O包完成服务时用到的信号量 */
    uint_t             status;           /* I/O状态 */
    uint_t             flag;             /* I/O标志 */
    sint_t             opcode;           /* I/O操作码 */
    enum OBJNODE_TYPE  type;             /* I/O包类型 */
    void *             ptr;              /* I/O对象指针 */
    uint_t             acstatus;         /* 访问状态 */
    uint_t             acsflag;          /* 访问标志 */
    uint_t             curops;           /* 不同操作, 意义不同 */
    uint_t             len;              /* 不同操作, 意义不同 */
    uint_t             ioctlcmd;         /* 控制码 */
    buf_t              buf;              /* 缓冲区地址 */
    size_t             bufsz;            /* 缓冲区大小 */
    uint_t             bufcurops;        /* 不同操作, 意义不同 */
    uint_t             count;            /* 不同操作, 意义不同 */
    void *             safedsc;          /* I/O包安全描述符 */

    /* 文件系统相关 */

    void *             fname;            /* 文件路径名指针 */
    void *             fnode;            /* 指向文件中的 fsobjmh_t 结构指针 */
    } objnode_t;


#endif
